package com.hnqcgczy.supplier.utils;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;

public class BaseServlet extends HttpServlet {

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        try {
            // 获取请求的方法名称
            String methodName = request.getParameter("type");
            if (methodName == null || methodName.isEmpty()) {
                methodName = "queryAll";
            }
            // 获取指定类的字节码对象
            Class<? extends BaseServlet> clazz = this.getClass();
            // 获取对应的方法
            Method method = clazz.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
            // 调用方法
            method.invoke(this, request, response);
        } catch (Exception e) {
            e.printStackTrace();
            // 处理异常
            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            response.getWriter().println("Internal Server Error");
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

/*
Java反射相关知识。动态代理。
package com.hnqcgczy.supplier.utils;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;

public class BaseServlet extends HttpServlet {
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        try {
            // 获取请求的方法名称
            String methodName = request.getParameter("type");
            if (methodName == null) {
                methodName = "queryAll";
            }
            // 获取指定类的字节码对象
            Class<? extends BaseServlet> clazz = this.getClass();
            */
/*
            这行代码使用 Java 反射机制从一个类中获取指定名称、指定参数类型的方法对象。
            具体来说，代码中的 clazz 表示要获取方法的类对象，methodName 表示要获取的方法名称，
            HttpServletRequest.class 和 HttpServletResponse.class 表示要获取的方法的参数类型，
            这里分别是 HttpServletRequest 类型和 HttpServletResponse 类型。
            如果该类中存在指定名称和参数类型的方法，则调用 getMethod 方法会返回该方法的 Method 对象，
            该对象可以用于调用该方法。如果不存在，则会抛出 NoSuchMethodException 异常。
            注意：该行代码的正确使用需要满足一定的前提条件，如类对象和方法名需要正确，
            且该方法必须是公共方法，否则也会抛出 NoSuchMethodException 异常。
            *//*

            Method method = clazz.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
            */
/**
 * 这行代码使用反射机制调用先前获取到的 Method 对象代表的方法，并传入两个参数 request 和 response，
 * 同时将该方法的调用者对象设为 this，也就是当前对象。
 * <p>
 * 具体来说，method 是先前获取到的 Method 对象，使用 invoke 方法调用该对象代表的方法，
 * 并传入两个参数 request 和 response，
 * 这里假设该方法的签名为 public void method(HttpServletRequest request, HttpServletResponse response)。
 * this 表示该方法的调用者对象，即当前对象。
 * <p>
 * 这行代码相当于执行了 this.method(request, response)，只不过使用了反射机制来调用该方法。
 * <p>
 * 需要注意的是，如果该方法需要抛出异常，则需要使用 try-catch 语句来处理。
 * 同时，如果该方法是私有方法，则需要使用 setAccessible(true) 方法来设置该方法的可访问性为 true，
 * 否则也会抛出 IllegalAccessException 异常。
 *//*

            method.invoke(this, request, response);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}*/
